import { validatenull } from './validate';
import request from '@/router/axios';
import * as CryptoJS from 'crypto-js';

// 表单序列化
export const serialize = (data) => {
	const list = [];
	Object.keys(data).forEach((ele) => {
		list.push(`${ele}=${data[ele]}`);
	});
	return list.join('&');
};
export const getObjType = (obj) => {
	let toString = Object.prototype.toString;
	let map = {
		'[object Boolean]': 'boolean',
		'[object Number]': 'number',
		'[object String]': 'string',
		'[object Function]': 'function',
		'[object Array]': 'array',
		'[object Date]': 'date',
		'[object RegExp]': 'regExp',
		'[object Undefined]': 'undefined',
		'[object Null]': 'null',
		'[object Object]': 'object',
	};
	if (obj instanceof Element) {
		return 'element';
	}
	return map[toString.call(obj)];
};
/**
 * 对象深拷贝
 */
export const deepClone = (data) => {
	let type = getObjType(data);
	let obj;
	if (type === 'array') {
		obj = [];
	} else if (type === 'object') {
		obj = {};
	} else {
		// 不再具有下一层次
		return data;
	}
	if (type === 'array') {
		for (let i = 0, len = data.length; i < len; i++) {
			obj.push(deepClone(data[i]));
		}
	} else if (type === 'object') {
		for (let key in data) {
			obj[key] = deepClone(data[key]);
		}
	}
	return obj;
};
/**
 * 判断路由是否相等
 */
export const diff = (obj1, obj2) => {
	delete obj1.close;
	let o1 = obj1 instanceof Object;
	let o2 = obj2 instanceof Object;
	if (!o1 || !o2) {
		/*  判断不是对象  */
		return obj1 === obj2;
	}

	if (Object.keys(obj1).length !== Object.keys(obj2).length) {
		return false;
		// Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,例如:数组返回下表:let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2;
	}

	for (let attr in obj1) {
		let t1 = obj1[attr] instanceof Object;
		let t2 = obj2[attr] instanceof Object;
		if (t1 && t2) {
			return diff(obj1[attr], obj2[attr]);
		} else if (obj1[attr] !== obj2[attr]) {
			return false;
		}
	}
	return true;
};
/**
 * 设置灰度模式
 */
export const toggleGrayMode = (status) => {
	if (status) {
		document.body.className = document.body.className + ' grayMode';
	} else {
		document.body.className = document.body.className.replace(' grayMode', '');
	}
};
/**
 * 设置主题
 */
export const setTheme = (name) => {
	document.body.className = name;
};

/**
 *加密处理
 */
export const encryption = (params) => {
	let { data, type, param, key } = params;
	const result = JSON.parse(JSON.stringify(data));
	if (type === 'Base64') {
		param.forEach((ele) => {
			result[ele] = btoa(result[ele]);
		});
	} else {
		param.forEach((ele) => {
			let data = result[ele];
			key = CryptoJS.enc.Latin1.parse(key);
			let iv = key;
			// 加密
			let encrypted = CryptoJS.AES.encrypt(data, key, {
				iv: iv,
				mode: CryptoJS.mode.CBC,
				padding: CryptoJS.pad.ZeroPadding,
			});
			result[ele] = encrypted.toString();
		});
	}
	return result;
};

/**
 * 浏览器判断是否全屏
 */
export const fullscreenToggel = () => {
	if (fullscreenEnable()) {
		exitFullScreen();
	} else {
		reqFullScreen();
	}
};
/**
 * esc监听全屏
 */
export const listenfullscreen = (callback) => {
	function listen() {
		callback();
	}

	document.addEventListener('fullscreenchange', function() {
		listen();
	});
	document.addEventListener('mozfullscreenchange', function() {
		listen();
	});
	document.addEventListener('webkitfullscreenchange', function() {
		listen();
	});
	document.addEventListener('msfullscreenchange', function() {
		listen();
	});
};
/**
 * 浏览器判断是否全屏
 */
export const fullscreenEnable = () => {
	return document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen;
};

/**
 * 浏览器全屏
 */
export const reqFullScreen = () => {
	if (document.documentElement.requestFullScreen) {
		document.documentElement.requestFullScreen();
	} else if (document.documentElement.webkitRequestFullScreen) {
		document.documentElement.webkitRequestFullScreen();
	} else if (document.documentElement.mozRequestFullScreen) {
		document.documentElement.mozRequestFullScreen();
	}
};
/**
 * 浏览器退出全屏
 */
export const exitFullScreen = () => {
	if (document.documentElement.requestFullScreen) {
		document.exitFullScreen();
	} else if (document.documentElement.webkitRequestFullScreen) {
		document.webkitCancelFullScreen();
	} else if (document.documentElement.mozRequestFullScreen) {
		document.mozCancelFullScreen();
	}
};
/**
 * 递归寻找子类的父类
 */

export const findParent = (menu, id) => {
	for (let i = 0; i < menu.length; i++) {
		if (menu[i].children.length !== 0) {
			for (let j = 0; j < menu[i].children.length; j++) {
				if (menu[i].children[j].id === id) {
					return menu[i];
				} else {
					if (menu[i].children[j].children.length !== 0) {
						return findParent(menu[i].children[j].children, id);
					}
				}
			}
		}
	}
};

/**
 * 动态插入css
 */

export const loadStyle = (url) => {
	const link = document.createElement('link');
	link.type = 'text/css';
	link.rel = 'stylesheet';
	link.href = url;
	const head = document.getElementsByTagName('head')[0];
	head.appendChild(link);
};
/**
 * 判断路由是否相等
 */
export const isObjectValueEqual = (a, b) => {
	let result = true;
	Object.keys(a).forEach((ele) => {
		const type = typeof a[ele];
		if (type === 'string' && a[ele] !== b[ele]) result = false;
		else if (type === 'object' && JSON.stringify(a[ele]) !== JSON.stringify(b[ele])) result = false;
	});
	return result;
};
/**
 * 根据字典的value显示label
 */
export const findByvalue = (dic, value) => {
	let result = '';
	if (validatenull(dic)) return value;
	if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
		let index = 0;
		index = findArray(dic, value);
		if (index !== -1) {
			result = dic[index].label;
		} else {
			result = value;
		}
	} else if (value instanceof Array) {
		result = [];
		let index = 0;
		value.forEach((ele) => {
			index = findArray(dic, ele);
			if (index !== -1) {
				result.push(dic[index].label);
			} else {
				result.push(value);
			}
		});
		result = result.toString();
	}
	return result;
};
/**
 * 根据字典的value查找对应的index
 */
export const findArray = (dic, value) => {
	for (let i = 0; i < dic.length; i++) {
		if (dic[i].value === value) {
			return i;
		}
	}
	return -1;
};
/**
 * 生成随机len位数字
 */
export const randomLenNum = (len, date) => {
	let random = '';
	random = Math.ceil(Math.random() * 100000000000000)
		.toString()
		.substr(0, len || 4);
	if (date) random = random + Date.now();
	return random;
};
/**
 * 打开小窗口
 */
export const openWindow = (url, title, w, h) => {
	// Fixes dual-screen position                            Most browsers       Firefox
	const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left;
	const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top;

	const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width;
	const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height;

	const left = width / 2 - w / 2 + dualScreenLeft;
	const top = height / 2 - h / 2 + dualScreenTop;
	const newWindow = window.open(
		url,
		title,
		'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left,
	);

	// Puts focus on the newWindow
	if (window.focus) {
		newWindow.focus();
	}
};

/**
 *  <img> <a> src 处理
 * @returns {PromiseLike<T | never> | Promise<T | never>}
 */
export function handleImg(url, id) {
	return validatenull(url)
		? null
		: request({
				url: url,
				method: 'get',
				responseType: 'blob',
		  }).then((response) => {
				// 处理返回的文件流
				const blob = response.data;
				const img = document.getElementById(id);
				img.src = URL.createObjectURL(blob);
				window.setTimeout(function() {
					window.URL.revokeObjectURL(blob);
				}, 0);
		  });
}

export function handleDown(filename, bucket) {
	return request({
		url: '/admin/sys-file/' + bucket + '/' + filename,
		method: 'get',
		responseType: 'blob',
	}).then((response) => {
		// 处理返回的文件流
		const blob = response.data;
		const link = document.createElement('a');
		link.href = URL.createObjectURL(blob);
		link.download = filename;
		document.body.appendChild(link);
		link.click();
		window.setTimeout(function() {
			URL.revokeObjectURL(blob);
			document.body.removeChild(link);
		}, 0);
	});
}

export function getQueryString(url, paraName) {
	const arrObj = url.split('?');
	if (arrObj.length > 1) {
		const arrPara = arrObj[1].split('&');
		let arr;
		for (let i = 0; i < arrPara.length; i++) {
			arr = arrPara[i].split('=');
			// eslint-disable-next-line eqeqeq
			if (arr != null && arr[0] == paraName) {
				return arr[1];
			}
		}
		return '';
	} else {
		return '';
	}
}

export function checkFileType(fileType, file) {
	const dotInd = file.name.lastIndexOf('.');
	const later = file.name.slice(dotInd + 1).toLocaleLowerCase();
	switch (fileType) {
		case 'pic':
			if (['jpg', 'jpeg', 'gif', 'png'].includes(later)) {
				return true;
			}
			return false;
		case 'img':
			if (['png', 'jpeg', 'jpg'].includes(later)) {
				return true;
			}
			return false;
		case 'PDF':
			if (['pdf'].includes(later)) {
				return true;
			}
			return false;
		case 'PPT':
			if (['ppt', 'pot', 'pptx', 'potx'].includes(later)) {
				return true;
			}
			return false;
		case '表格':
			if (['xls', 'xlsx'].includes(later)) {
				return true;
			}
			return false;
		case '文档':
			if (['doc', 'docx', 'txt', 'csv'].includes(later)) {
				return true;
			}
			return false;
		default:
			break;
	}
}

// 文件下载
export function downloadFile(res, fileName, mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
	let blob = new Blob([res.data], {
		type: mimeType + ';charset=utf-8',
	});
	let src = window.URL.createObjectURL(blob);
	if (src) {
		let a = document.createElement('a');
		a.setAttribute('href', src);
		a.setAttribute('download', fileName);
		let evObj = document.createEvent('MouseEvents');
		evObj.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, true, false, 0, null);
		a.dispatchEvent(evObj);
	}
}

//时间戳转换方法    date:时间戳数字
export function formatDate2(date) {
	if (!date) {
		date = new Date();
	} else {
		date = new Date(date);
	}
	let YY = date.getFullYear() + '-';
	let MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
	let DD = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
	let hh = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
	let mm = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
	let ss = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
	return YY + MM + DD + ' ' + hh + mm + ss;
}

// 返回n天内的yyyy-MM-dd HH:mm:ss日期格
// 返回结构[yyyy - MM - dd , yyyy - MM - dd ]
// date: 天数
export function formatDate3(date) {
	let time2 = new Date().getTime();
	let time1 = time2 - date * 1000 * 60 * 60 * 24;
	time1 = formatDate2(time1);
	time1 = time1.slice(0, time1.length - 8);
	time2 = formatDate2(time2);
	time2 = time2.slice(0, time2.length - 8);
	return [time1, time2];
}

// 二级以上路由拆装到二级路由平级上
export function newFormat(menu) {
	menu.map((item) => {
		// 进入一级菜单循环(item)
		if (item.children && item.children.length > 0) {
			let newAddMenu = [];
			item.children.map((i) => {
				// 进入二级菜单循环(i)
				if (i.children && i.children.length > 0) {
					// 找到三级菜单，处理(i.children)
					newAddMenu.push(...handleMenu(i.children));
					// 众所周知，三级菜单都处理为了[]
					i.children = [];
				}
			});
			item.children.push(...newAddMenu);
		}
	});
	return menu;
}

// 二级以上菜单的递归
export function handleMenu(menu) {
	// 拿到的是一个二级菜单的children，这个函数是找出这个children中所有的子菜单，
	// 拆出来拼在一个数组里
	let newMenu = [];
	menu.map((i) => {
		if (i.children && i.children.length > 0) {
			newMenu.push(...handleMenu(i.children));
			// 众所周知，子菜单都处理为了[]
			i.children = [];
		} else {
			newMenu.push(i);
		}
	});
	return newMenu;
}
